<script type="text/javascript">
	document.write('<br>数组创建 Array.of(): <br>'); 
	//数组创建
	//Array.of() 将参数中所有值作为元素形成数组。

	document.write(Array.of(1, 2, 3, 4)+'<br>\n'); // [1, 2, 3, 4]
	// 参数值可为不同类型
	document.write(Array.of(1, '2', true)+'<br>\n'); // [1, '2', true]
	// 参数为空时返回空数组
	document.write(Array.of()+'<br>\n'); // []


	//Array.from() 将类数组对象或可迭代对象转化为数组。
	// 参数为数组,返回与原数组一样的数组
	document.write(Array.from([1, 2])+'<br>\n'); // [1, 2]
	 
	// 参数含空位
	document.write(Array.from([1, , 3])+'<br>\n'); // [1, undefined, 3]
	//mapFn 可选，map 函数，用于对每个元素进行处理，放入数组的是处理后的元素。
	document.write(Array.from([1, 2, 3], (n) => n * 2)+'<br>\n'); // [2, 4, 6]
	//thisArg 可选，用于指定 map 函数执行时的 this 对象。
	let map = {
	    do: function(n) {
	        return n * 2;
	    }
	}
	let arrayLike = [1, 2, 3];
	document.write(
		Array.from(arrayLike, 
			function (n){
		    	return this.do(n);
			}, map)
	); // [2, 4, 6]



	document.write('<br><br><br>类数组对象: <br>'); 
	//类数组对象 一个类数组对象必须含有 length 属性，且元素属性名必须是数值或者可转换为数值的字符。
	let arr = Array.from({
				  0: '1',
				  1: '2',
				  2: 3,
				  length: 3
				});
	document.write(arr+'<br>\n');


	// 没有 length 属性,则返回空数组
	let array = Array.from({
	  0: '1',
	  1: '2',
	  2: 3,
	});
	document.write(array+'<br>\n'); // []



	// 元素属性名不为数值且无法转换为数值，返回长度为 length 元素值为 undefined 的数组  
	let array1 = Array.from({
	  a: 1,
	  b: 2,
	  length: 2
	});
	document.write(array1+'<br>\n'); // [undefined, undefined]

	//转换可迭代对象
	//转换 map
	let map1 = new Map();
	map1.set('key0', 'value0');
	map1.set('key1', 'value1');
	document.write(Array.from(map1)+'<br>\n');
	console.log(Array.from(map1)+'<br>\n'); // key0,value0,key1,value1

	//转换 set
	let arr1 = [1, 2, 3];
	let set = new Set(arr1);
	document.write(Array.from(set)+'<br>\n'); // [1, 2, 3]

	//转换字符串
	let str = 'abc';
	document.write(Array.from(str)+'<br>\n'); // ["a", "b", "c"]




	document.write('<br><br><br>扩展的方法 find(): <br>'); 
	//1. 查找 find() 查找数组中符合条件的元素,若有多个符合条件的元素，则返回第一个元素。
	let arr2 = Array.of(1, 2, 3, 4);
	document.write(arr2.find(item => item > 2)+'<br>\n'); // 3
	 
	// 数组空位处理为 undefined
	document.write([, 1].find(n => true)+'<br>\n'); // undefined


	//2. findIndex() 查找数组中符合条件的元素索引，若有多个符合条件的元素，则返回第一个元素索引。
	let arr3 = Array.of(1, 2, 1, 3);
	// 参数1：回调函数
	// 参数2(可选)：指定回调函数中的 this 值
	document.write(arr3.findIndex(item => item == 2)+'<br>\n'); // 1
	 
	// 数组空位处理为 undefined
	document.write([, 1].findIndex(n => true)+'<br>\n'); //0

	document.write('<br>填充: <br>'); 
	//填充
	//3. fill()将一定范围索引的数组元素内容填充为单个指定的值。
	let arr4 = Array.of(1, 2, 3, 4);
	// 参数1：用来填充的值
	// 参数2：被填充的起始索引
	// 参数3(可选)：被填充的结束索引，默认为数组末尾
	document.write(arr4.fill(0,1,2)+'<br>\n'); // [1, 0, 3, 4]

	//4. copyWithin()将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。
	// 参数1：被修改的起始索引
	// 参数2：被用来覆盖的数据的起始索引
	// 参数3(可选)：被用来覆盖的数据的结束索引，默认为数组末尾
	document.write([1, 2, 3, 4].copyWithin(0,2,4)+'<br>\n'); // [3, 4, 3, 4]
	 
	// 参数1为负数表示倒数
	document.write([1, 2, 3, 4].copyWithin(-2, 0)+'<br>\n'); // [1, 2, 1, 2]
	 
	document.write([1, 2, ,4].copyWithin(0, 2, 4)+'<br>\n'); // [, 4, , 4]

</script>